home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
t_os
/
acc130
/
acc130.asm
< prev
next >
Wrap
Assembly Source File
|
1991-10-18
|
12KB
|
607 lines
;
; ACcess Check ACC.com ( MASM 用 ソース )
;
; 書式 ACC ACCを常駐する
; ACC -R ACCの常駐解除
;
;
; 原作 ACLAMP .ASM パオパオ(Y.Hirata)さん作を ディスアセンブル
;
; v1.10 90/12/?? ACLAMPをディスアセンブルしたものにボリュー
; ムランプ表示機能をつける
; v1.20 91/01/10 システム領域への表示をやめる
; v1.30 91/09/01 点灯パターンをパラメータ指定にする
;
.286p
code segment byte
assume cs:code,ds:code
a_lamp equ 04ech
vollamp MACRO
; push ax
; push dx
mov ah,al
mov dx,a_lamp
in al,dx
and al,01000000b ;ミュートかかっているか?
or al,ah
out dx,al
; pop dx
; pop ax
ENDM
ORG 002ch
d_002c label byte
ORG 0080h
d_0080 label byte
ORG 100h
start:
jmp j_0388
db 0dh
db ' ',0dh,0ah,07h,0dh,0ah
db ' '
chkword db 'ACcess Check'
chk_end db ' V1.21 1991-01-10',0dh,0ah,0dh,0ah
db ' Copyright (C) T.Tacasaka & Y.Hirata 1990,1991.'
db 0dh,0ah,0dh,0ah,1ah
w_016d dw 0fffeh ; int 93h の割り込みベクタ(オリジナル)
w_016f dw 0ffffh ; の待機領域
w_0171 dw 0fffeh ; int 40h の割り込みベクタ(オリジナル)
w_0173 dw 0ffffh ; の待機領域
w_0175 dw 0000h ; ランプ表示を消すかのカウンタ
d_0177 db 00h ; int 93h に重複してはいったかのチェック
d_0178 db 00h ; int 40h に重複してはいったかのチェック
d_0179 db 01h ; インジケータ点灯中フラグ
;w_0203 dw 0000h
;d_0205 db 00h
l_read db 00000000b
l_write db 00000000b
l_fd db 00000000b
l_hd db 00000000b
l_ram db 00000000b
l_cd db 00000000b
l_rom db 00000000b
l_ic db 00000000b
l_ext db 00000000b
;--------------------- int 40h -----------------------------------------
;
; インジケータを消すタイミングの制御
;
; int 40h は インタバルタイマ(らしい)
;
;
d_0206:
PUSH AX
PUSH CX
PUSH DX ;0208 52
PUSH BX ;0209 53
PUSH SP ;020A 54
PUSH BP ;020B 55
PUSH SI ;020C 56
PUSH DI ;020D 57
PUSH DS ;020E 1E
PUSH ES ;020F 06
MOV BP,SP ;0210 8B EC bp <- sp
MOV AX,CS ;0212 8C C8
MOV DS,AX ;0214 8E D8 ds <- cs
MOV ES,AX ;0216 8E C0 es <- cs
CLI ;原作 →不要ではないか?
CLD ;0219 FC
CMP BYTE PTR d_0178,01h ;021A 80 3E 78 01 01
; ↑ このルーチン 実行中に 再び コールされた場合(実行中フラグ)
JNZ j_0223 ;021F 75 02
JMP SHORT j_0275 ;0221 EB 52
; すぐに帰る
j_0223:
mov byte ptr d_0178 ,01h ;実行中フラグセット
cmp byte ptr d_0179 ,01h ;表示中か?
jz j_0231 ;表示中
jmp short j_0275
j_0231:
inc word ptr w_0175
cmp word ptr w_0175 ,+40h ;
je j_023e ; 40h 回目なら消去
cmp word ptr w_0175 ,+500h ; 500h回目以上なら
jnb j_big ; ボリュームランプにもどす
jmp j_0275 ; それ以外 すぐにかえる
j_023e:
mov al,10001111b ; すべてのランプ消去 ○○○○○
vollamp
jmp j_0275
j_big:
mov al,00001111b ;ボリュームランプにもどす
vollamp
mov word ptr w_0175 ,0000h ; カウンタクリア
mov byte ptr d_0179 ,00h ; 表示中フラグクリア
j_0275:
mov sp,bp
pop es
pop ds
pop di
pop si
pop bp
pop bx
pop bx
pop dx
pop cx
pop ax
mov byte ptr cs:d_0178 ,00h ; 実行中フラグクリア
jmp dword ptr cs:w_0171 ; int 40h (オリジナル)へ
;-------------------------- int 93h -------------------------------------
d_028c:
CMP AH,5 ; もしデータの読み出しなら
JZ j_0299 ; 表示ルーチンへ
CMP AH,6 ; もしデータの書き込みなら
JZ j_0299 ; 表示ルーチンへ
JMP j_0383 ; それ以外は そのままオリジナル
j_0299:
push ax
push cx
push dx
push bx
push sp
push bp
push si
push di
push ds
push es
mov bp,sp ; bp <- sp
push ax ;
mov ax,cs ;
mov ds,ax ; ds <- cs
mov es,ax ; es <- cs
pop ax ;
cli
cld
cmp byte ptr d_0177 ,01h ; このルーチン実行中でないか
jnz j_02b9 ;
jmp j_0371 ; 実行中ならすぐに帰る
j_02b9:
mov byte ptr d_0177 ,01h ; 実行中フラグon
mov cl,00h ;
cmp ah,06h ; データ書き込み???
jnz j_02c8 ;
jmp short j_02d0 ;
j_02c8: ; データ読みこみ
or cl,l_read
jmp short j_02d6 ;
j_02d0: ; データ書き込み
or cl,l_write
j_02d6:
cmp al,42h ;
jnz j_02ea ;
or cl,l_rom
jmp j_034a
j_02ea:
cmp al,40h ;
jnz j_02fe ;
or cl,l_ram
jmp j_034a
j_02fe:
and al,0f0h
cmp al,0c0h
jnz j_0314
or cl,l_cd ;○○●○○
jmp short j_034a
j_0314:
cmp al,20h ;
jnz j_0328
or cl,l_fd ;●○○○○
jmp short j_034a
j_0328:
cmp al,0b0h
jnz j_033c ;
or cl,l_hd
jmp short j_034a
j_033c:
or cl,l_ext
j_034a:
not cl ; alを反転(0で点灯)
and cl,10001111b ;
mov al,cl
vollamp
mov word ptr w_0175 ,0000h ;表示時間カウンタクリア
mov byte ptr d_0179 ,01h ;表示中カウンタセット
j_0371:
mov sp,bp
pop es
pop ds
pop di
pop si
pop bp
pop bx
pop bx
pop dx
pop cx
pop ax
mov byte ptr cs:d_0177 ,00h ;実行中フラグクリア
j_0383:
jmp dword ptr cs:w_016d ;オリジナル 93hへ
;------------常駐するのは ここ(らへん)まで--(↑)------------------------------
j_0388: ;常駐、削除ルーチンエントリ
mov cx,d_0539 - d_04cc ;6dh 文字
mov di,offset d_04cc ;'アクセスランプ表示~
mov ah,1eh ;コンソールに表示
int 91h
mov si,offset d_0080 ;0080h~ コマンドパラメータ
inc si
cmp byte ptr cs:[si],0dh
jnz j001
jmp error ;パラメータがない
j00: inc si
cmp byte ptr cs:[si],0dh
jnz j001
jmp j_0451 ;パラメータ終了
j001:
cmp byte ptr cs:[si],' ' ;空白はパラメータ読みなおし
jz j00
cmp byte ptr cs:[si],'-' ;パラメータ先頭コード
jz j01
cmp byte ptr cs:[si],'/' ;
jz j01
jmp error
j01: inc si
or byte ptr cs:[si],20h ;大文字→小文字
cmp byte ptr cs:[si],'r'
jnz j011
jmp release
j011: cmp byte ptr cs:[si],'f'
jz fd_set
cmp byte ptr cs:[si],'h'
jz hd_set
cmp byte ptr cs:[si],'c'
jz cd_set
cmp byte ptr cs:[si],'a'
jz ram_set
cmp byte ptr cs:[si],'o'
jz rom_set
cmp byte ptr cs:[si],'w'
jz wri_set
cmp byte ptr cs:[si],'i'
jz ic_set
jmp error
fd_set: call getdec
cmp al,10h
jbe jfd0
jmp error
jfd0: mov l_fd,al
jmp j00
hd_set: call getdec
cmp al,10h
jbe jhd0
jmp error
jhd0: mov l_hd,al
jmp j00
cd_set: call getdec
cmp al,10h
jbe jcd0
jmp error
jcd0: mov l_cd,al
jmp j00
ram_set: call getdec
cmp al,10h
jbe jram0
jmp error
jram0: mov l_ram,al
jmp j00
rom_set: call getdec
cmp al,10h
jbe jrom0
jmp error
jrom0: mov l_rom,al
jmp j00
wri_set:
call getdec
cmp al,10h
jbe jwri0
jmp error
jwri0: mov l_write,al
jmp j00
ic_set: call getdec
cmp al,10h
jbe jic0
jmp error
jic0: mov l_ic,al
jmp j00
j_0396:
inc si ;0080hにはコマンドパラメータの文字数
cmp byte ptr cs:[si],20h ;' '
jz j_0396
cmp byte ptr cs:[si],2fh ;'/'
jz j_03b2
cmp byte ptr cs:[si],2dh ;'-'
jz j_03b2
cmp byte ptr cs:[si],0dh ;0dhはパラメータ列の最終尾のしるし
jnz j_0396
jmp j_0451 ;
j_03b2:
cmp byte ptr cs:[si+01h],0dh ; / - の次が 0dh か?
jnz j_03bc ; no
jmp j_0451 ; yes
j_03bc:
or byte ptr cs:[si+01h],20h ;' '大文字→小文字
cmp byte ptr cs:[si+01h],72h ;'r'
jz release ;常駐解除ルーチンへ
jmp j_0451
release: ;常駐解除
mov ax,3593h ;int 93h割り込みベクタ読みだし
int 21h ;→ES:BX
mov cx,chk_end - chkword ;常駐チェック
mov si,offset chkword ;ds:si(このプログラム)
mov di,offset chkword ;es:di(常駐している?このプログラム)
repz cmpsb ;違う文字またはcxまでくりかえす
jz j_03e0 ;0bh文字目まで一致
jmp short j_0441 ;常駐していない
j_03e0:
mov al,00001111b ;ボリュームランプにもどす
vollamp
mov cx,d_0565 - d_054f ;
mov di,offset d_054f ;'☆ 解除したよ~ん ☆'
mov ah,1eh ;を表示
int 91h ;
lds dx,dword ptr es:w_0171 ;w_0171~を ds:dxへ
mov ax,2540h ;int 40h の割り込みベクタ復帰
int 21h ;
lds dx,dword ptr es:w_016d ;w_016d~を ds:dxへ
mov ax,2593h ;int 93h の割り込みベクタ復帰
int 21h
push es
mov si,offset d_002c ;環境のセグメントアドレス
mov ax,es:[si] ;
mov es,ax ;常駐している
mov ah,49h ;メモリブロックの開放
int 21h
pop es
mov ah,49h ;常駐しているプログラム
int 21h ;のメモリブロックの開放
mov ax,4c00h ;プロセス終了 ・ リターンコード 0
int 21h
;常駐解除プログラムはここまで
error:
mov cx,errmsgend - errmsg ;
mov di,offset errmsg ;'常駐しないよ!'
mov ah,1eh ;の表示
int 91h ;
mov ax,4c00h ; '常駐しないよ!'
int 21h ;表示プログラムここまで
j_0441:
mov cx,d_0589 - errmsg ;
mov di,offset d_0576 ;'常駐しないよ!'
mov ah,1eh ;の表示
int 91h ;
mov ax,4c00h ; '常駐しないよ!'
int 21h ;表示プログラムここまで
j_0451: ;常駐させるルーチン
mov ax,3540h ; 40h の割り込みベクタよみだし
int 21h ; -> es:bx
mov cs:w_0171 ,bx ; w_0171~に 40h割り込みベクタ
mov cs:w_0173 ,es ; (オリジナル)をセーブ
mov ax,3593h ; 93h の割り込みベクタ読み出し
int 21h ; -> es:bx
mov cs:w_016d ,bx ; w_0171~に 93h割り込みベクタ
mov cs:w_016f ,es ; (オリジナル)をセーブ
mov cx,chk_end - chkword ; すでに常駐されているか
mov si,offset chkword ; チェック
mov di,offset chkword ;
repz cmpsb ;
jnz j_0497 ;
mov cx,d_0576 - d_0565 ;0011h ; すでに常駐している
mov di,offset d_0565 ; '常駐してるよ!'
mov ah,1eh ; 表示
int 91h ;
mov cx,d_0end - d_0589 ;0032h ;
mov di,offset d_0589 ; '使用方法~
mov ah,1eh ; 表示
int 91h ;
mov ax,4c00h ; '常駐してるよ'
int 21h ; 表示プログラムおしまい
j_0497:
mov cx,d_054f - d_0539 ;0016h ;
mov di,offset d_0539 ; '★ 常駐するよ~ん ★'
mov ah,1eh ; 表示
int 91h ;
mov cx,d_0end - d_0589 ;0032h ;
mov di,offset d_0589 ; '使用方法 ~
mov ah,1eh ; 表示
int 91h ;
mov dx,offset d_0206 ; 40h のフックアドレスは d_0206
mov ax,2540h ; 割り込みベクタ設定
int 21h ;
mov dx,offset d_028c ; 93h のフックアドレスは d_028c
mov ax,2593h ; 割り込みベクタ設定
int 21h ;
mov dx,offset j_0388 ; dx <- 常駐サイズ
add dx,+0fh ; dx = dx + 0fh (割った時余り分が
mov cl,04h ; 繰り上がるように)
shr dx,cl ; dx = dx \ 16
mov ax,3100h ; プログラム常駐終了 ( リターンコード 0 )
int 21h ; dx = 常駐するプログラムのパラグラフサイズ
getdec: ;proc near ;パラメータの数値を得る
push bx
mov al,00h
gj00:
inc si
mov bl,byte ptr cs:[si]
cmp bl,'0'
jb gj01
cmp bl,'5'
jbe gj10 ;'0'から'5'ならgj10
gj01: cmp bl,'6'
jb gj02
cmp bl,'9'
jbe gj11 ;'6'から'9'ならgj11
gj02: cmp bl,'a'
jb gj03
cmp bl,'f'
jbe gj12 ;'a'から'f'ならgj12
gj03: cmp bl,'A'
jb gj04
cmp bl,'F'
jbe gj13 ;'A'から'F'ならgj13
gj04: cmp bl,' '
jz gj21 ;' 'なら終了
cmp bl,0dh
jz gj20 ;0dhなら終了
gj05: mov al,0ffh
jmp gj21 ;それ以外ならエラー(-1)
gj10: cmp al,00h
jz gj11 ;
cmp al,01h
jnz gj05
mov al,bl
sub al,'0'-10 ;
jmp gj00
gj11: mov al,bl
sub al,'0'
jmp gj00
gj12: mov al,bl
sub al,'a'-10
jmp gj00
gj13: mov al,bl
sub al,'A'-10
jmp gj00
gj20: dec si
gj21: pop bx
ret
d_04cc db 'アクセスチェック (C)おくと , パオパオ 1990,1991.',0dh,0ah
db '<< Copyright (C) T.takasaka , Y.Hirata 1990,1991 >>'
db 0dh,0ah,0dh,0ah
db 'ACcess Check Version 1.21 '
d_0539 db ' ★ 常駐するよ~ん ★',0dh,0ah
d_054f db ' ☆ 解除したよ~ん ☆',0dh,0ah
d_0565 db ' 常駐してるよ!',07h,0dh,0ah
d_0576 db ' 常駐しないよ!',07h,0dh,0ah
errmsg db ' 使い方 ',0dh,0ah
db ' ACC -R :常駐解除 ',0dh,0ah
db ' -Hnn :ハードディスク -Fnn:フロッピィディスク',0dh,0ah
db ' -Ann :RAMディスク -Cnn:CD ROM',0dh,0ah
db ' nn→点灯パターン ○1○2○3○4',07h,0dh,0ah
errmsgend:
d_0589 db 0dh,0ah,'使用方法 ★ オプションスイッチ /r で、常駐解除します。'
db 0dh,0ah
d_0end db 02h
code ends
end start